package com.gitee.sop.file;

import com.aliyun.oss.model.ObjectListing;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 阿里云oss服务
 *
 * @author: huwei
 * @date: 2019/12/6 15:10
 * @version: 1.0.0
 */
public class AliyunOssService {

    private AliyunOssStore aliyunOssStore;

    private AliOssProperties aliyunOssProperties;

    public AliyunOssService(AliOssProperties aliyunOssProperties) {
        this.aliyunOssStore = new AliyunOssStore(aliyunOssProperties.getEndpoint(), aliyunOssProperties.getAccessKeyId(), aliyunOssProperties.getAccessKeySecret(), aliyunOssProperties.getBucketName(), aliyunOssProperties.getCdn());
        this.aliyunOssProperties = aliyunOssProperties;
    }

    /**
     * 上传资源
     *
     * @param ossKey 资源key
     * @param file   资源文件
     * @return true 上传成功， false 上传失败
     */
    public boolean upload(String ossKey, File file) {
        String res = aliyunOssStore.uploadFileToOSS(file, wrapperOssKey(ossKey));
        return res != null;
    }

    /**
     * 上传资源
     *
     * @param ossKey 资源key
     * @param buf    资源缓存
     * @return true 上传成功， false 上传失败
     */
    public boolean upload(String ossKey, byte[] buf) {
        String res = aliyunOssStore.uploadFileToOSS(buf, wrapperOssKey(ossKey));
        return res != null;
    }

    /**
     * 上传资源
     *
     * @param ossKey 资源key
     * @param is     资源输入流
     * @return true 上传成功， false 上传失败
     */
    public boolean upload(String ossKey, InputStream is) {
        String res = aliyunOssStore.uploadFileToOSS(is, wrapperOssKey(ossKey));
        return res != null;
    }

    /**
     * 下载指定资源
     *
     * @param ossKey 资源key
     * @return
     */
    public byte[] download(String ossKey) {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        aliyunOssStore.downOutputStream(byteArrayOutputStream, wrapperOssKey(ossKey));
        byte[] buf = byteArrayOutputStream.toByteArray();
        try {
            byteArrayOutputStream.close();
        } catch (IOException e) {
        }
        return buf;
    }

    /**
     * 删除指定资源
     *
     * @param ossKey 资源key
     */
    public void delete(String ossKey) {
        aliyunOssStore.deleteFileFromOSS(wrapperOssKey(ossKey));
    }

    /**
     * 批量删除指定资源
     *
     * @param ossKeyList
     */
    public void batchDelete(List<String> ossKeyList) {

        aliyunOssStore.deleteFileFromOSS(wrapperOssKey(ossKeyList));
    }

    /**
     * 下载地址
     *
     * @param ossKey 资源key，用于标识存储于阿里云oss的资源；格式：a/b/c/d/1.txt
     * @return
     */
    public String downloadUrl(String ossKey) {
        return aliyunOssProperties.getCdn().concat("/").concat(wrapperOssKey(ossKey));
    }

    /**
     * 封装ossKey，为上传资源添加统一的根目录
     *
     * @param ossKey 资源key
     * @return
     */
    public String wrapperOssKey(String ossKey) {
        StringBuffer sb = new StringBuffer();
        sb.append(aliyunOssProperties.getRoot()).append("/").append(ossKey);
        return sb.toString();
    }

    private List<String> wrapperOssKey(List<String> ossKeyList) {
        List<String> res = new ArrayList<>(ossKeyList.size());
        ossKeyList.forEach(x -> {
            res.add(wrapperOssKey(x));
        });
        return res;
    }

    ///////////////////////////文件管理 begin////////////////////////////

    /**
     * 下载地址
     *
     * @param allKey 全路径
     * @return
     */
    public String dealWebUrl(String allKey) {
        return aliyunOssProperties.getCdn().concat("/").concat(allKey);
    }

    /**
     * 分页查询
     *
     * @param key        查询的路径 /sys/a/xxx
     * @param nextMarker 下一个开始参数
     * @param size       每页数
     * @return
     */
    public ObjectListing queryBykeyAndPage(String key, String nextMarker, int size) {
        return aliyunOssStore.searchByPage(wrapperOssKey(key), nextMarker, size);
    }


    /**
     * 判断指定文件是否存在
     *
     * @param key
     * @return
     */
    public boolean doesObjectExist(String key) {
        return aliyunOssStore.doesObjectExist(wrapperOssKey(key));
    }

    /**
     * 上传文件
     *
     * @param key
     * @param fileByte
     * @return
     */
    public boolean uploadOrigin(String key, byte[] fileByte) {
        String s = aliyunOssStore.uploadFileToOSS(fileByte, wrapperOssKey(key));
        return null != s;
    }

    /**
     * 批量删除
     *
     * @param ossKeyList
     */
    public void batchDeleteReal(List<String> ossKeyList) {
        aliyunOssStore.deleteFileFromOSS(ossKeyList);
    }

    /**
     * 拷贝文件
     *
     * @param originKey 原key
     * @param newKey    新key
     */
    public void copyFile(String originKey, String newKey) {
        aliyunOssStore.copyFile(originKey, newKey);
    }

    /**
     * 获取指定目录下的所有文件信息
     *
     * @param key 查询目录路径
     * @return
     */
    public ObjectListing searchAll(String key) {
        return aliyunOssStore.searchAll(key);
    }

    /**
     * 流下载
     *
     * @param key
     * @param out
     */
    public void down(String key, OutputStream out) {
        aliyunOssStore.download(key, out);
    }

    /**
     * 下载到本地
     *
     * @param key  下载key
     * @param file 本地路径
     */
    public void downloadLocal(String key, File file) {
        aliyunOssStore.downloadLocal(key, file);
    }

    /**
     * 获取文件内容
     *
     * @param key
     * @return
     * @throws IOException
     */
    public String readFileContent(String key) throws IOException {
        return aliyunOssStore.readFileContent(key);
    }
}
